﻿using System.Collections.Generic;

namespace System.Erp.Runtime.Composition
{
    /// <summary>
    /// 零部件的装配工，允许将一批零件安装到某个机器或从机器中拆卸出。
    /// </summary>
    /// <remarks>
    /// <typeparam name="T">零件实例的类型，例如是一个服务实现或事件切片。</typeparam>
    /// <para>
    /// 这里的一批零件是T的特定实例集合，T可能是服务实现、事件切片或者其他，而此接口的实现者
    /// 目的就是将这些零件组装到系统中。
    /// </para>
    /// </remarks>
    public interface IFitter<T>
    {
        /// <summary>
        /// 将一批零件安装到机器上，即由此接口的实现类将一批对象应用到服务提供者上。
        /// </summary>
        /// <param name="parts">一批零件，即此接口实现类承认的零件集合</param>
        /// <param name="provider">某个服务提供者。</param>
        void Install(IEnumerable<T> parts, IServiceProvider provider);

        /// <summary>
        /// 将一批零件从机器上卸载，即由此接口的实现类将一批对象从服务提供者上删除。
        /// </summary>
        /// <param name="parts">要卸载的零件</param>
        /// <param name="provider">某个服务提供者。</param>
        void UnInstall(IEnumerable<T> parts, IServiceProvider provider);
    }
}
